package com.java.servlet.web.usuarios.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.java.servlet.web.commons.CatalogoComunVo;
import com.java.servlet.web.commons.PropertiesUtils;
import com.java.servlet.web.roles.controller.RolesController;
import com.java.servlet.web.usuarios.service.UsuariosService;
import com.java.servlet.web.usuarios.service.UsuariosServiceImpl;
import com.java.servlet.web.usuarios.vo.UsuariosVo;

/**
 * Servlet implementation class UsuariosController
 */
@WebServlet (name = "UsuariosController", urlPatterns = "/usuarios/usuariosController")
public class UsuariosController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final Logger log = Logger.getLogger(RolesController.class);
	private static final int INIT_USUARIO = 1;
	private static final int EDITAR_USUARIO = 2;
	private static final int GUARDAR_EDIT_USUARIO = 3;
	private static final int NUEVO_USUARIO = 4;
	private static final int GUARDAR_NUEVO_USUARIO = 5;
	private static final int ELIMINAR_USUARIO = 6;
	private Properties viewConfig;
	private Properties fieldConfig;
	private UsuariosService usuariosService;
	private UsuariosVo usuariosVo;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UsuariosController() {
    }
    public void init() {
		try {
			super.init();
			usuariosService = new UsuariosServiceImpl();
			viewConfig = PropertiesUtils.getPropertiesFromFile(getServletContext().getResource("/WEB-INF/view-config.properties"));
			fieldConfig = PropertiesUtils.getPropertiesFromFile(getServletContext().getResource("/WEB-INF/form-config.properties"));
		} catch (MalformedURLException ex) {
			log.info("Error fatal, no se puedo cargar el archivo de configuracion de vistas." + ex);
		} catch(ServletException serEx){
			log.info("Error fatal, no se puedo cargar el archivo de configuracion de vistas." + serEx);
		}
    }
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
		int metodo = Integer.parseInt(request.getParameter("method"));
		RequestDispatcher dispatcher = null;
		HttpSession sessionApp = request.getSession(true);
		boolean session = (Boolean) ((Boolean) sessionApp.getAttribute("auth") != null ?sessionApp.getAttribute("auth"):false);
		try {
			if(session){
				switch (metodo) {
				case INIT_USUARIO:
					usuariosVo = new UsuariosVo();
					List<UsuariosVo> getListaUsuarios = usuariosService.getListaUsuarios(usuariosVo);
					request.setAttribute("getListaUsuarios", getListaUsuarios);
					dispatcher = request.getRequestDispatcher(viewConfig.getProperty("init.usuarios"));
					dispatcher.forward(request, response);
					break;
				case EDITAR_USUARIO:
					usuariosVo = new UsuariosVo();
					int idUsuario = Integer.parseInt(request.getParameter("idUsuario"));
					usuariosVo.setIdUsuario(idUsuario);
					UsuariosVo usuarioVo = usuariosService.getUsuario(usuariosVo);
					request.setAttribute("usuarioVo", usuarioVo);
					request.setAttribute("listSexo", usuariosService.getCatSexo());
					request.setAttribute("listRoles", usuariosService.getCatRoles());
					request.setAttribute("listVigencia", getCatVigencia());
					dispatcher = request.getRequestDispatcher(viewConfig.getProperty("editar.usuario"));
					dispatcher.forward(request, response);
				break;
				case GUARDAR_EDIT_USUARIO:
					usuariosService.guardarEditUsuario(getUsuarioEditFromRequest(request));
					dispatcher = request.getRequestDispatcher(viewConfig.getProperty("control.init.usuarios"));
					dispatcher.forward(request, response);
				break;
				case NUEVO_USUARIO:
					request.setAttribute("listSexo", usuariosService.getCatSexo());
					request.setAttribute("listRoles", usuariosService.getCatRoles());
					request.setAttribute("listVigencia", getCatVigencia());
					dispatcher = request.getRequestDispatcher(viewConfig.getProperty("nuevo.usuario"));
					dispatcher.forward(request, response);
				break;
				case GUARDAR_NUEVO_USUARIO:
					usuariosService.guardarNuevoUsuario(getUsuarioNewFromRequest(request));
					dispatcher = request.getRequestDispatcher(viewConfig.getProperty("control.init.usuarios"));
					dispatcher.forward(request, response);
				break;
				case ELIMINAR_USUARIO:
					usuariosVo = new UsuariosVo();
					int idUsuarioEliminar = Integer.parseInt(request.getParameter("idUsuario"));
					usuariosVo.setIdUsuario(idUsuarioEliminar);
					usuariosService.borrarUsuario(usuariosVo);
					dispatcher = request.getRequestDispatcher(viewConfig.getProperty("control.init.usuarios"));
					dispatcher.forward(request, response);
				break;
				}
		} else {
			dispatcher = request.getRequestDispatcher(viewConfig.getProperty("session.no.existe"));
			dispatcher.forward(request, response);
		}
		} catch (Exception e) {
            request.setAttribute("ex", e);
            dispatcher = request.getRequestDispatcher(viewConfig.getProperty("error"));
            dispatcher.forward(request, response);
			System.out.println("Error en LoginController " + e);
			e.printStackTrace();
		} finally {
            out.close();
        }
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}
    private UsuariosVo getUsuarioNewFromRequest(HttpServletRequest request) {
    	UsuariosVo usuario = new UsuariosVo();
            if (StringUtils.isNotBlank(request.getParameter(fieldConfig.getProperty("form.usuario.aliasUsuario")))) {
            	usuario.setAliasUsuario(request.getParameter(fieldConfig.getProperty("form.usuario.aliasUsuario")));
            }
            usuario.setClaveUsuario(request.getParameter(fieldConfig.getProperty("form.usuario.claveUsuario")));
            usuario.setNomUsuario(request.getParameter(fieldConfig.getProperty("form.usuario.nomUsuario")));
            usuario.setPatUsuario(request.getParameter(fieldConfig.getProperty("form.usuario.patUsuario")));
            usuario.setMatUsuario(request.getParameter(fieldConfig.getProperty("form.usuario.matUsuario")));
            usuario.setSexoUsuario(Integer.parseInt(request.getParameter(fieldConfig.getProperty("form.usuario.sexoUsuario"))));
            usuario.setIdRol(Integer.parseInt(request.getParameter(fieldConfig.getProperty("form.usuario.idRol"))));
            usuario.setIdVigencia(request.getParameter(fieldConfig.getProperty("form.usuario.idVigencia")));
 
        return usuario;
    }
    private UsuariosVo getUsuarioEditFromRequest(HttpServletRequest request) {
    	UsuariosVo usuario = new UsuariosVo();
    	usuario.setIdUsuario(Integer.parseInt(request.getParameter(fieldConfig.getProperty("form.usuario.idUsuario"))));
    	 if (StringUtils.isNotBlank(request.getParameter(fieldConfig.getProperty("form.usuario.aliasUsuario")))) {
         	usuario.setAliasUsuario(request.getParameter(fieldConfig.getProperty("form.usuario.aliasUsuario")));
         }
         usuario.setClaveUsuario(request.getParameter(fieldConfig.getProperty("form.usuario.claveUsuario")));
         usuario.setNomUsuario(request.getParameter(fieldConfig.getProperty("form.usuario.nomUsuario")));
         usuario.setPatUsuario(request.getParameter(fieldConfig.getProperty("form.usuario.patUsuario")));
         usuario.setMatUsuario(request.getParameter(fieldConfig.getProperty("form.usuario.matUsuario")));
         usuario.setSexoUsuario(Integer.parseInt(request.getParameter(fieldConfig.getProperty("form.usuario.sexoUsuario"))));
         usuario.setIdRol(Integer.parseInt(request.getParameter(fieldConfig.getProperty("form.usuario.idRol"))));
         usuario.setIdVigencia(request.getParameter(fieldConfig.getProperty("form.usuario.idVigencia")));

        return usuario;
    }
	private List<CatalogoComunVo> getCatVigencia(){
		CatalogoComunVo catalogoComunVo = null;
		List<CatalogoComunVo> listaVigencia = new ArrayList<CatalogoComunVo>();
		
		catalogoComunVo = new CatalogoComunVo();
		catalogoComunVo.setIdValorCad("S");
		catalogoComunVo.setDescValor("SI");
		listaVigencia.add(catalogoComunVo);
		
		catalogoComunVo = new CatalogoComunVo();
		catalogoComunVo.setIdValorCad("N");
		catalogoComunVo.setDescValor("NO");
		listaVigencia.add(catalogoComunVo);
		
		return listaVigencia;
	}

}
